/*

dp[i][j]=修第i个课程时(以i为根)，总共选修了j门课程学习的最大学分是多少

dp[u][j]=max(
    dp[u][j],
    dp[v][1~j-1]+v[u]
)

*/

#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;

ll n,m;
std::vector<ll> f,val;
std::vector<std::vector<ll>> dp;
std::vector<std::vector<ll>> edg;

static inline void dfs(const ll u){
    dp[u][1]=val[u];
    for(auto v:edg[u]){
        dfs(v);
        for(ll i=m;i>=1;--i){
            for(ll j=i-1;j>=1;--j){
                dp[u][i]=std::max(
                    dp[u][i],
                    dp[v][j]+dp[u][i-j]
                );
            }
        }
    }
}

int main(){
    std::iostream::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::cin>>n>>m;
    ++m;
    f.resize(n+1);
    val.resize(n+1);
    dp.resize(n+1,std::vector<ll>(m+1));
    edg.resize(n+1);
    for(ll i=1;i<=n;++i){
        std::cin>>f[i]>>val[i];
        edg[f[i]].push_back(i);
    }
    dfs(0);
    std::cout<<dp[0][m]<<"\n";
}   